
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
   "http://www.w3.org/TR/html4/strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>05_prop</title>
	<meta name="author" content="Stark" />
	<!-- Date: 2018-10-18 -->
	<script type="text/javascript">
		function say(num) {
			/**
			 * 在函数对象中有一个属性叫做arguments，通过这个属性可以获取相应的参数值，这个属性
			 * 是一个数组，其实就是传递进来的参数
			 */
			alert(arguments.length);
			for(var i=0;i<arguments.length;i++) {
				alert(arguments[i]);
			}
			alert(num);
		}

		/**
		 * 在arguments这个对象中有一个callee的方法，arguments.callee(arg)可以反向的调用函数
		 */		
		//say(1,2,3);
		
		// 求阶乘的函数,以下递归调用的函数名和原有的函数名耦合在一起了，如果将来这个函数名称更改之后
		// 递归调用就会失效
		function factorial(num) {
			if(num<=1) return 1;
			// 此时和函数名耦合
			// else return num*factorial(num-1);
			// 以下就实现了函数名的解耦合，在js中通常就是使用这种方式做递归
			else return num*arguments.callee(num-1);
		}
		var cf = factorial;
		alert(cf(5));
		factorial = null;
		// 此时由于cf这个函数依然使用factorial这个名称来调用，但是factorial已经指向了null，所以会报错
		alert(cf(5));
		 
	</script>
</head>
<body">
	<div id="person"></div>
</body>
</html>

